import numpy as np
import base64
import itertools
import hashlib


class SimpleCrypto:
    def __init__(self, key):
        """
        初始化加密类。

        :param key: 用于加密和解密的密钥。
        """
        key_md = hashlib.md5(key.encode('utf-8')).hexdigest()
        k = ""
        for i in key_md:
            # 凯撒加密
            k += chr(ord(i) + len(key_md))

        self.key = hashlib.md5(k.encode('utf-8')).digest()

    def text_to_numbers(self, text):
        """将文本转换为UTF-8编码的数字列表。"""
        return [byte for byte in text.encode('utf-8')]

    def numbers_to_text(self, numbers):
        """将UTF-8编码的数字列表转换回文本。"""
        return bytes(numbers).decode('utf-8')

    def encrypt(self, text):
        """
        使用初始化时提供的密钥加密文本。

        :param text: 要加密的文本。
        :return: 加密后的文本。
        """
        numbers = self.text_to_numbers(text)
        key_numbers = itertools.cycle(self.key)

        # 使用密钥修改数字
        encrypted_numbers = [(num ^ next(key_numbers)) for num in numbers]

        # 将加密后的数字转换为字符串格式
        encrypted_text = base64.b64encode(np.array(encrypted_numbers, dtype=np.uint8).tobytes()).decode('utf-8')

        return encrypted_text

    def decrypt(self, encrypted_text):
        """
        使用初始化时提供的密钥解密文本。

        :param encrypted_text: 要解密的文本。
        :return: 解密后的文本或 None（如果解密失败）。
        """
        try:
            encrypted_numbers = np.frombuffer(base64.b64decode(encrypted_text), dtype=np.uint8)
            key_numbers = itertools.cycle(self.key)

            # 使用密钥反转对数字的修改
            decrypted_numbers = [(num ^ next(key_numbers)) for num in encrypted_numbers]

            # 将解密后的数字转换回文本
            decrypted_text = self.numbers_to_text(decrypted_numbers)

            return decrypted_text
        except Exception as e:
            print(f'解密失败: 密钥可能不正确')
            # return None
